#include "stdafx.h"
#include "DXCommon.h"

namespace ja2{ namespace sgp
{
	void dx_attempt(HRESULT ErrorCode)
	{
		if(ErrorCode != DD_OK)
		{
			// Get description
			char const *desc = get_dx_error_desc(ErrorCode);
			// Log message
			JA2_FAST_DEBUG_MESSAGE("DIRECTX COMMON: DirectX Error\n" );
			JA2_FAST_DEBUG_MESSAGE(desc);
			// Throw it
			throw RuntimeException(desc);
		}
	}

	char const *get_dx_error_desc(HRESULT Error)
	{
		char const *description = nullptr;
		switch( Error ) 
		{
		case DD_OK:
			description = "No error.";
			break;
		case DDERR_ALREADYINITIALIZED:
			description = "The object has already been initialized.";
			break;
		case DDERR_BLTFASTCANTCLIP:
			description = "A DirectDrawClipper object is attached to a source surface that has passed into a call to the IDirectDrawSurface2::BltFast method.";
			break;
		case DDERR_CANNOTATTACHSURFACE :
			description = "A surface cannot be attached to another requested surface.";
			break;
		case DDERR_CANNOTDETACHSURFACE:
			description = "A surface cannot be detached from another requested surface.";
			break;
		case DDERR_CANTCREATEDC:
			description = "Windows cannot create any more device contexts (DCs).";
			break;
		case DDERR_CANTDUPLICATE:
			description = "Primary and 3D surfaces, or surfaces that are implicitly created, cannot be duplicated.";
			break;
		case DDERR_CANTLOCKSURFACE:
			description = "Access to this surface is refused because an attempt was made to lock the primary surface without DCI support.";
			break;
		case DDERR_CANTPAGELOCK:
			description = "An attempt to page lock a surface failed. Page lock will not work on a display-memory surface or an emulated primary surface.";
			break;
		case DDERR_CANTPAGEUNLOCK:
			description = "An attempt to page unlock a surface failed. Page unlock will not work on a display-memory surface or an emulated primary surface.";
			break;
		case DDERR_CLIPPERISUSINGHWND:
			return "An attempt was made to set a clip list for a DirectDrawClipper object that is already monitoring a window handle.";
		case DDERR_COLORKEYNOTSET:
			return "No source color key is specified for this operation.";
				case DDERR_CURRENTLYNOTAVAIL 
					: return "No support is currently available.";
					case DDERR_DCALREADYCREATED 
						: return "A device context (DC) has already been returned for this surface. Only one DC can be retrieved for each surface.";
						case DDERR_DIRECTDRAWALREADYCREATED 
							: return "A DirectDraw object representing this driver has already been created for this process.";
							case DDERR_EXCEPTION 
								: return "An exception was encountered while performing the requested operation.";
								case DDERR_EXCLUSIVEMODEALREADYSET 
									: return "An attempt was made to set the cooperative level when it was already set to exclusive.";
									case DDERR_GENERIC 
										: return "There is an undefined error condition.";
										case DDERR_HEIGHTALIGN 
											: return "The height of the provided rectangle is not a multiple of the required alignment.";
											case DDERR_HWNDALREADYSET 
												: return "The DirectDraw cooperative level window handle has already been set. It cannot be reset while the process has surfaces or palettes created.";
												case DDERR_HWNDSUBCLASSED 
													: return "DirectDraw is prevented from restoring state because the DirectDraw cooperative level window handle has been subclassed.";
													case DDERR_IMPLICITLYCREATED 
														: return "The surface cannot be restored because it is an implicitly created surface.";
														case DDERR_INCOMPATIBLEPRIMARY 
															: return "The primary surface creation request does not match with the existing primary surface.";
															case DDERR_INVALIDCAPS 
																: return "One or more of the capability bits passed to the callback function are incorrect.";
																case DDERR_INVALIDCLIPLIST 
																	: return "DirectDraw does not support the provided clip list.";
																	case DDERR_INVALIDDIRECTDRAWGUID 
																		: return "The globally unique identifier (GUID) passed to the DirectDrawCreate function is not a valid DirectDraw driver identifier.";
																		case DDERR_INVALIDMODE 
																			: return "DirectDraw does not support the requested mode.";
																			case DDERR_INVALIDOBJECT 
																				: return "DirectDraw received a pointer that was an invalid DirectDraw object.";
																				case DDERR_INVALIDPARAMS 
																					: return "One or more of the parameters passed to the method are incorrect.";
																					case DDERR_INVALIDPIXELFORMAT 
																						: return "The pixel format was invalid as specified.";
																						case DDERR_INVALIDPOSITION 
																							: return "The position of the overlay on the destination is no longer legal.";
																							case DDERR_INVALIDRECT 
																								: return "The provided rectangle was invalid.";
																								case DDERR_INVALIDSURFACETYPE 
																									: return "The requested operation could not be performed because the surface was of the wrong type.";
																									case DDERR_LOCKEDSURFACES 
																										: return "One or more surfaces are locked, causing the failure of the requested operation.";
																										case DDERR_NO3D 
																											: return "No 3D hardware or emulation is present.";
																											case DDERR_NOALPHAHW 
																												: return "No alpha acceleration hardware is present or available, causing the failure of the requested operation.";
																												case DDERR_NOBLTHW 
																													: return "No blitter hardware is present.";
																													case DDERR_NOCLIPLIST 
																														: return "No clip list is available.";
																														case DDERR_NOCLIPPERATTACHED 
																															: return "No DirectDrawClipper object is attached to the surface object.";
																															case DDERR_NOCOLORCONVHW 
																																: return "The operation cannot be carried out because no color-conversion hardware is present or available.";
																																case DDERR_NOCOLORKEY 
																																	: return "The surface does not currently have a color key.";
																																	case DDERR_NOCOLORKEYHW 
																																		: return "The operation cannot be carried out because there is no hardware support for the destination color key.";
																																		case DDERR_NOCOOPERATIVELEVELSET 
																																			: return "A create function is called without the IDirectDraw2::SetCooperativeLevel method being called.";
																																			case DDERR_NODC 
																																				: return "No DC has ever been created for this surface.";
																																				case DDERR_NODDROPSHW 
																																					: return "No DirectDraw raster operation (ROP) hardware is available.";
																																					case DDERR_NODIRECTDRAWHW 
																																						: return "Hardware-only DirectDraw object creation is not possible; the driver does not support any hardware.";
																																						case DDERR_NODIRECTDRAWSUPPORT 
																																							: return "DirectDraw support is not possible with the current display driver.";
																																							case DDERR_NOEMULATION 
																																								: return "Software emulation is not available.";
																																								case DDERR_NOEXCLUSIVEMODE 
																																									: return "The operation requires the application to have exclusive mode, but the application does not have exclusive mode.";
																																									case DDERR_NOFLIPHW 
																																										: return "Flipping visible surfaces is not supported.";
																																										case DDERR_NOGDI 
																																											: return "No GDI is present.";
																																											case DDERR_NOHWND 
																																												: return "Clipper notification requires a window handle, or no window handle has been previously set as the cooperative level window handle.";
																																												case DDERR_NOMIPMAPHW 
																																													: return "The operation cannot be carried out because no mipmap texture mapping hardware is present or available.";
																																													case DDERR_NOMIRRORHW 
																																														: return "The operation cannot be carried out because no mirroring hardware is present or available.";
																																														case DDERR_NOOVERLAYDEST 
																																															: return "The IDirectDrawSurface2::GetOverlayPosition method is called on an overlay that the IDirectDrawSurface2::UpdateOverlay method has not been called on to establish a destination.";
																																															case DDERR_NOOVERLAYHW 
																																																: return "The operation cannot be carried out because no overlay hardware is present or available.";
																																																case DDERR_NOPALETTEATTACHED 
																																																	: return "No palette object is attached to this surface.";
																																																	case DDERR_NOPALETTEHW 
																																																		: return "There is no hardware support for 16- or 256-color palettes.";
																																																		case DDERR_NORASTEROPHW 
																																																			: return "The operation cannot be carried out because no appropriate raster operation hardware is present or available.";
																																																			case DDERR_NOROTATIONHW 
																																																				: return "The operation cannot be carried out because no rotation hardware is present or available.";
																																																				case DDERR_NOSTRETCHHW 
																																																					: return "The operation cannot be carried out because there is no hardware support for stretching.";
																																																					case DDERR_NOT4BITCOLOR 
																																																						: return "The DirectDrawSurface object is not using a 4-bit color palette and the requested operation requires a 4-bit color palette.";
																																																						case DDERR_NOT4BITCOLORINDEX 
																																																							: return "The DirectDrawSurface object is not using a 4-bit color index palette and the requested operation requires a 4-bit color index palette.";
																																																							case DDERR_NOT8BITCOLOR 
																																																								: return "The DirectDrawSurface object is not using an 8-bit color palette and the requested operation requires an 8-bit color palette.";
																																																								case DDERR_NOTAOVERLAYSURFACE 
																																																									: return "An overlay component is called for a non-overlay surface.";
																																																									case DDERR_NOTEXTUREHW 
																																																										: return "The operation cannot be carried out because no texture-mapping hardware is present or available.";
																																																										case DDERR_NOTFLIPPABLE 
																																																											: return "An attempt has been made to flip a surface that cannot be flipped.";
																																																											case DDERR_NOTFOUND 
																																																												: return "The requested item was not found.";
																																																												case DDERR_NOTINITIALIZED 
																																																													: return "An attempt was made to call an interface method of a DirectDraw object created by CoCreateInstance before the object was initialized.";
																																																													case DDERR_NOTLOCKED 
																																																														: return "An attempt is made to unlock a surface that was not locked.";
																																																														case DDERR_NOTPAGELOCKED 
																																																															: return "An attempt is made to page unlock a surface with no outstanding page locks.";
																																																															case DDERR_NOTPALETTIZED 
																																																																: return "The surface being used is not a palette-based surface.";
																																																																case DDERR_NOVSYNCHW 
																																																																	: return "The operation cannot be carried out because there is no hardware support for vertical blank synchronized operations.";
																																																																	case DDERR_NOZBUFFERHW 
																																																																		: return "The operation to create a z-buffer in display memory or to perform a blit using a z-buffer cannot be carried out because there is no hardware support for z-buffers.";
																																																																		case DDERR_NOZOVERLAYHW 
																																																																			: return "The overlay surfaces cannot be z-layered based on the z-order because the hardware does not support z-ordering of overlays.";
																																																																			case DDERR_OUTOFCAPS 
																																																																				: return "The hardware needed for the requested operation has already been allocated.";
																																																																				case DDERR_OUTOFMEMORY 
																																																																					: return "DirectDraw does not have enough memory to perform the operation.";
																																																																					case DDERR_OUTOFVIDEOMEMORY 
																																																																						: return "DirectDraw does not have enough display memory to perform the operation.";
																																																																						case DDERR_OVERLAYCANTCLIP 
																																																																							: return "The hardware does not support clipped overlays.";
																																																																							case DDERR_OVERLAYCOLORKEYONLYONEACTIVE 
																																																																								: return "An attempt was made to have more than one color key active on an overlay.";
																																																																								case DDERR_OVERLAYNOTVISIBLE 
																																																																									: return "The IDirectDrawSurface2::GetOverlayPosition method is called on a hidden overlay.";
																																																																									case DDERR_PALETTEBUSY 
																																																																										: return "Access to this palette is refused because the palette is locked by another thread.";
																																																																										case DDERR_PRIMARYSURFACEALREADYEXISTS 
																																																																											: return "This process has already created a primary surface.";
																																																																											case DDERR_REGIONTOOSMALL 
																																																																												: return "The region passed to the IDirectDrawClipper::GetClipList method is too small.";
																																																																												case DDERR_SURFACEALREADYATTACHED 
																																																																													: return "An attempt was made to attach a surface to another surface to which it is already attached.";
																																																																													case DDERR_SURFACEALREADYDEPENDENT 
																																																																														: return "An attempt was made to make a surface a dependency of another surface to which it is already dependent.";
																																																																														case DDERR_SURFACEBUSY 
																																																																															: return "Access to the surface is refused because the surface is locked by another thread.";
																																																																															case DDERR_SURFACEISOBSCURED 
																																																																																: return "Access to the surface is refused because the surface is obscured.";
																																																																																case DDERR_SURFACELOST 
																																																																																	: return "Access to the surface is refused because the surface memory is gone. The DirectDrawSurface object representing this surface should have the IDirectDrawSurface2::Restore method called on it.";
																																																																																	case DDERR_SURFACENOTATTACHED 
																																																																																		: return "The requested surface is not attached.";
																																																																																		case DDERR_TOOBIGHEIGHT 
																																																																																			: return "The height requested by DirectDraw is too large.";
																																																																																			case DDERR_TOOBIGSIZE 
																																																																																				: return "The size requested by DirectDraw is too large. However, the individual height and width are OK.";
																																																																																				case DDERR_TOOBIGWIDTH 
																																																																																					: return "The width requested by DirectDraw is too large.";
																																																																																					case DDERR_UNSUPPORTED 
																																																																																						: return "The operation is not supported.";
																																																																																						case DDERR_UNSUPPORTEDFORMAT 
																																																																																							: return "The FourCC format requested is not supported by DirectDraw.";
																																																																																							case DDERR_UNSUPPORTEDMASK 
																																																																																								: return "The bitmask in the pixel format requested is not supported by DirectDraw.";
																																																																																								case DDERR_UNSUPPORTEDMODE 
																																																																																									: return "The display is currently in an unsupported mode.";
																																																																																									case DDERR_VERTICALBLANKINPROGRESS 
																																																																																										: return "A vertical blank is in progress.";
																																																																																										case DDERR_WASSTILLDRAWING 
																																																																																											: return "The previous blit operation that is transferring information to or from this surface is incomplete.";
																																																																																											case DDERR_WRONGMODE 
																																																																																												: return "This surface cannot be restored because it was created in a different mode.";
																																																																																												case DDERR_XALIGN 
																																																																																													: return "The provided rectangle was not horizontally aligned on a required boundary.";
																																																																																													default
																																																																																														: return "Unrecognized error value.\0";
		}

		return description;
	}
} /*sgp*/} /*ja2*/